算法提高 8皇后·改
问题描述
规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
输入格式
一个8*8的棋盘。
输出格式
所能得到的最大数字和
样例输入
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
样例输出
260
数据规模和约定
棋盘上的数字范围0~99
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.Collections; 4 import java.util.List; 5 import java.util.Scanner; 6 7 public class Main{ 8 static int[][] a; 9 static boolean[] leftup; 10 static boolean[] leftdown; 11 static boolean[] lie; 12 static int max = 0; 13 public static void main(String[] args) { 14 Scanner input = new Scanner(System.in); 15 a = new int[9][9]; 16 leftup = new boolean[16]; 17 leftdown = new boolean[16]; 18 lie = new boolean[9]; 19 for(int i=1;i<=8;i++){ 20 for(int j=1;j<=8;j++){ 21 a[i][j] = input.nextInt(); 22 } 23 } 24 f(1,0); 25 System.out.println(max); 26 } 27 public static void f(int i,int sum){ 28 if(i==9){ 29 if(max<sum){ 30 max = sum; 31 } 32 return; 33 } 34 for(int j=1;j<=8;j++){ 35 if(!lie[j]&&!leftup[i+j-1]&&!leftdown[j-i+8]){ 36 lie[j] = true; 37 leftup[i+j-1] = true; 38 leftdown[j-i+8] = true; 39 f(i+1,sum+a[i][j]); 40 lie[j] = false; 41 leftup[i+j-1] = false; 42 leftdown[j-i+8] = false; 43 } 44 } 45 } 46 }